home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 228_01 / bdsmark.doc < prev    next >
Text File  |  1987-07-29  |  19KB  |  346 lines

  1.  
  2.  
  3.                                  BDSMARK.C
  4.  
  5.  
  6.  
  7.                                David D. Clark
  8.                             507 N. Division St.
  9.                             Bristol, IN   46507
  10.  
  11.  
  12.  
  13.         The Problem
  14.  
  15.           BD Softwares' C compiler was one of the first C compilers
  16.         for micro computers and is still one of the best.  A lot of
  17.         good public domain and commercial software (like my favorite
  18.         word processing program and another of my favorite C
  19.         compilers) has been written with it.  It is a fast
  20.         development system and produces fast and compact code.
  21.  
  22.           Unfortunatley, it is only available for CP/M systems.  If
  23.         you have a computer running a different operating system or
  24.         CPU and you want to port some of the excellent software
  25.         written in BDS C, you have to resort to a different compiler
  26.         on the new machine.  That is not the only problem however.
  27.         BDS C prior to version 1.6 is not a particularly portable
  28.         version of C because a number of the "standard" library
  29.         routines are not standard as used in "The C Programming
  30.         Language" (1) (hereafter referred to as "K&R") or C compilers
  31.         running on UNIX.  (Some of these routines do not really
  32.         exist in the UNIX C standard library but are simulations of
  33.         UNIX system calls on a CP/M system.)
  34.  
  35.           When I started working with a Zenith Z-150 running MS-DOS,
  36.         I was faced with the formidable task of porting a lot of my
  37.         favorite public domain and self-written programs, written in
  38.         BDS C, to the new system.  Too, now that version 1.6 has
  39.         arrived, with its more standard i/o library, I have a lot of
  40.         code that needs translation to the new version as well.
  41.  
  42.  
  43.         The Nonstandard "Standard" Functions
  44.  
  45.           After a bit of careful reading, I determined that there
  46.         were 9 functions in the old (pre version 1.6) BDS C standard
  47.         library that were not implemented as per K&R or, if K&R was
  48.         not clear about a particular function, the UNIX version 7 C
  49.         compiler.  Some of the differences are trivial, others are
  50.         not.  These functions, and the differences between the BDS
  51.         version and the standard version, are listed below:
  52.  
  53.         creat          The BDS C version requires only one
  54.                        parameter, the file name, while the K&R
  55.                        version requires two: the file name and a
  56.                        protection mode.  Admittedly, the protection
  57.                        mode argument is useless in a CP/M
  58.                        environment, but may be needed under a
  59.                        different operating system.  This function is
  60.                        the same in the new version of the BDS
  61.                        library.
  62.  
  63.         exit           According to K&R, exit will flush any open
  64.                        buffered files before closing them.  BDS C
  65.                        does not flush the file buffer before closing
  66.                        the file.
  67.  
  68.         fgets          Again, there is a difference in the number
  69.                        and meaning of parameters accepted by the old
  70.                        BDS C function and the K&R version.  The old
  71.                        BDS C function expects to be called with a
  72.                        pointer to the string to fill and a pointer
  73.                        to a BDS C specific file buffer associated
  74.                        with the input device.  The K&R version also
  75.                        expects to be called with a pointer to the
  76.                        string to be filled, but followed by the
  77.                        maximum number of characters to fill the
  78.                        string with and a pointer to a FILE variable
  79.                        associated with the input device.  This
  80.                        version of this function included with
  81.                        version 1.6 of BDS C is K&R compatible.
  82.  
  83.         fopen          In this case, the arguments and the value
  84.                        returned by the functions are different.  The
  85.                        old BDS library function expects to be called
  86.                        with a pointer to the name of the file and a
  87.                        pointer to the buffer variable to be
  88.                        associated with the open file.  It returns an
  89.                        integer representing the file descriptor of
  90.                        the opened file or -1 if an error occurs
  91.                        during the attempt to open the file.  The K&R
  92.                        version also expects a pointer to the name of
  93.                        the file but expects a pointer to a character
  94.                        representing the mode (read, write or append)
  95.                        in which the file is to be opened.  The
  96.                        function returns a pointer to a FILE variable
  97.                        to be associated with the open file or NULL
  98.                        in case of an error.  The new BDS C 1.6
  99.                        function is compatible.
  100.  
  101.         getc           The new version of this function differs from
  102.                        the old in that it now differentiates between
  103.                        text and binary modes.  In text mode, CP/M
  104.                        line end sequences (a carriage return/line
  105.                        feed pair) is translated to a single line
  106.                        feed character.
  107.  
  108.         getchar        The new version of this function
  109.                        distinguishes between text and binary modes
  110.                        like getc.
  111.  
  112.         putc           The new version of this function also
  113.                        differentiates between binary and text
  114.                        modes.
  115.  
  116.         puts           The difference here is small but can greatly
  117.                        affect screen displays that use the
  118.                        function.  The UNIX version of the function
  119.                        always appends a new line character to the
  120.                        end of the string it prints to the standard
  121.                        output.  The BDS function does not.
  122.  
  123.         read           In this case, one of the arguments in the BDS
  124.                        version of the function represents the number
  125.                        of 128 byte blocks to be read.  This is
  126.                        reasonable in a CP/M environment where the
  127.                        smallest unit of disk I/O is 128 bytes.  The
  128.                        K&R version of the function expects the
  129.                        corresponding argument to represent the
  130.                        number of individual bytes to be read.  The
  131.                        functions return values representing
  132.                        different things too.  The BDS function
  133.                        returns the number of blocks read while the
  134.                        K&R version returns the number of bytes.
  135.                        This function has not changed in the new
  136.                        version of the BDS library.
  137.  
  138.         tolower        This function is somewhat ambiguously defined
  139.                        in K&R. The UNIX version (a macro actually)
  140.                        does the conversion regardless of whether of
  141.                        not the argument was upper case to begin
  142.                        with.  The BDS function checks the argument
  143.                        to determine if it is upper case before
  144.                        performing the conversion.  Most other
  145.                        microcomputer versions of C do the same check
  146.                        before conversion.
  147.  
  148.         toupper        The same problem occurs with this function as
  149.                        with tolower.  UNIX does not check the case
  150.                        of the argument before converting while BDS C
  151.                        does.  This seems like a very innocuous
  152.                        difference, but it is the one that most often
  153.                        caused me trouble.  Again